﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using ProyectoGrupo5.ClasesDominio;
using System.Data.SqlClient;
using System.Data;

//20/05/2011

namespace ProyectoGrupo5.Persistencia
{
    public class PostulanteDAO : IPostulanteDAO
    {
        //Atributos
        private String cadenaConexion = "Data Source=LOCALHOST;Initial Catalog=BOLSA_TRABAJO;User Id=PRUEBA;Password=prueba;";
        private SqlConnection conexion;

        public PostulanteDAO()
        {
             conexion = new SqlConnection(cadenaConexion);
        }

        public Postulante CrearPostulante(Postulante postulante)
        {
           Postulante existeC = this.VerificaCodigoPostulante(postulante.CodigoPostulante);
           if (existeC != null)
           {
               throw new Exception("El Postulante con CODIGO " + postulante.CodigoPostulante + " ya existe!");
           }
           else
           {
               conexion.Open();
               //Creamos nuestra Sentencia Insert
               String sentencia = "Insert Into POSTULANTE Values(@cp,@ap,@am,@nm,@sx,@em,@fn,@pw);";
               SqlCommand comando = new SqlCommand(sentencia, conexion);
               //Agregamos nuestros parametros a nuestra consulta 
               comando.Parameters.Add(new SqlParameter("@cp", SqlDbType.Int)).Value      = postulante.CodigoPostulante;
               comando.Parameters.Add(new SqlParameter("@ap", SqlDbType.NVarChar)).Value = postulante.ApellidoPaterno;
               comando.Parameters.Add(new SqlParameter("@am", SqlDbType.NVarChar)).Value = postulante.ApellidoMaterno;
               comando.Parameters.Add(new SqlParameter("@nm", SqlDbType.NVarChar)).Value = postulante.Nombre;
               comando.Parameters.Add(new SqlParameter("@sx", SqlDbType.NVarChar)).Value = postulante.Sexo;
               comando.Parameters.Add(new SqlParameter("@em", SqlDbType.NVarChar)).Value = postulante.Correo;
               comando.Parameters.Add(new SqlParameter("@fn", SqlDbType.DateTime)).Value = postulante.FechaNacimiento;
               comando.Parameters.Add(new SqlParameter("@pw", SqlDbType.NVarChar)).Value = postulante.Contrasena;
               //Ejecutamos Consulta
               comando.ExecuteNonQuery();
               conexion.Close();
               return this.ObtenerPostulante(postulante.CodigoPostulante); //TODO: Queda pendiente de devolver objeto creado
           }
        }

        public Postulante VerificaCodigoPostulante(Int32 codigo)
        {
            conexion.Open();
            String sentencia = "Select * From POSTULANTE Where CodigoPostulante=@cp";
            SqlCommand comando = new SqlCommand(sentencia, conexion);
            //Agregamos nuestros parametros a nuestra consulta 
            comando.Parameters.Add(new SqlParameter("@cp", SqlDbType.Int)).Value = codigo;
            SqlDataReader resultado = comando.ExecuteReader();
            Postulante postulante = null;
            if (resultado.HasRows) //Si el resultado tiene filas
            {
                postulante = new Postulante();
                resultado.Read(); //Avanzar el índice de la lista de la fila 0 a la fila 1
                postulante.CodigoPostulante = (Int32)resultado["codigopostulante"];
            }
            resultado.Close();
            conexion.Close();
            return postulante;
        }

        public Postulante ObtenerPostulante(Int32 codigo)
        {
           Postulante existeC = this.VerificaCodigoPostulante(codigo);
           if (existeC == null)
           {
               throw new Exception("El Postulante con CODIGO " + codigo + " NO existe!");
           }
           else
           {
               conexion.Open();
               String sentencia = "Select * From POSTULANTE Where CodigoPostulante=@cp";
               SqlCommand comando = new SqlCommand(sentencia, conexion);
               comando.Parameters.Add(new SqlParameter("@cp", SqlDbType.Int)).Value = codigo;
               SqlDataReader resultado = comando.ExecuteReader();
               Postulante postulante = new Postulante();
               if (resultado.HasRows) //Si el resultado tiene filas, llenamos el objeto
               {
                   resultado.Read(); //Avanzar el índice de la lista de la fila 0 a la fila 1
                   postulante.CodigoPostulante = (Int32)resultado["codigopostulante"];
                   postulante.ApellidoPaterno  = (String)resultado["apellidopaterno"];
                   postulante.ApellidoMaterno  = (String)resultado["apellidomaterno"];
                   postulante.Nombre           = (String)resultado["nombre"];
                   postulante.Sexo             = (String)resultado["sexo"];
                   postulante.Correo           = (String)resultado["correo"];
                   postulante.FechaNacimiento  = (DateTime)resultado["fechanacimiento"];
                   postulante.Contrasena       = (String)resultado["Contrasena"];
               }
               resultado.Close();
               conexion.Close();
               return postulante;
           }
        }

        public Postulante ModificarPostulante(Postulante postulante)
        {
            Postulante existeC = this.VerificaCodigoPostulante(postulante.CodigoPostulante);
            if (existeC == null)
            {
                throw new Exception("El Postulante con CODIGO " + postulante.CodigoPostulante + " No existe!");
            }
            else
            {
                conexion.Open();
                String sentencia = "Update POSTULANTE Set "
                + "ApellidoPaterno=@ap, ApellidoMaterno=@am, Nombre=@nm, Sexo=@sx, Correo=@em, FechaNacimiento=@fn, Contrasena=@pw "
                + "Where CodigoPostulante=@cp";
                SqlCommand comando = new SqlCommand(sentencia, conexion);
                comando.Parameters.Add(new SqlParameter("@cp", SqlDbType.Int)).Value      = postulante.CodigoPostulante;
                comando.Parameters.Add(new SqlParameter("@ap", SqlDbType.NVarChar)).Value = postulante.ApellidoPaterno;
                comando.Parameters.Add(new SqlParameter("@am", SqlDbType.NVarChar)).Value = postulante.ApellidoMaterno;
                comando.Parameters.Add(new SqlParameter("@nm", SqlDbType.NVarChar)).Value = postulante.Nombre;
                comando.Parameters.Add(new SqlParameter("@sx", SqlDbType.NVarChar)).Value = postulante.Sexo;
                comando.Parameters.Add(new SqlParameter("@em", SqlDbType.NVarChar)).Value = postulante.Correo;
                comando.Parameters.Add(new SqlParameter("@fn", SqlDbType.DateTime)).Value = postulante.FechaNacimiento;
                comando.Parameters.Add(new SqlParameter("@pw", SqlDbType.NVarChar)).Value = postulante.Contrasena;
                //Ejecutamos Consulta
                comando.ExecuteNonQuery();
                conexion.Close();
                return this.ObtenerPostulante(postulante.CodigoPostulante); //TODO: Queda pendiente de devolver objeto creado
            }           
        }
        
        public void EliminarPostulante(Int32 codigo)
        {
            Postulante existeC = this.VerificaCodigoPostulante(codigo);
            if (existeC == null)
            {
                throw new Exception("El Postulante con CODIGO " + codigo + " NO existe!");
            }
            else
            {
                conexion.Open();
                String sentencia = "Delete From POSTULANTE Where CodigoPostulante=@cp";
                SqlCommand comando = new SqlCommand(sentencia, conexion);
                comando.Parameters.Add(new SqlParameter("@cp", SqlDbType.Int)).Value = codigo;
                comando.ExecuteNonQuery();
                conexion.Close();
            }
        }

        public ICollection<Postulante> ListarPostulantesTodos()
        {

            List<Postulante> listaPostulante = new List<Postulante>();
 
            conexion.Open();
            String sentencia = "Select * From POSTULANTE";
            SqlCommand comando = new SqlCommand(sentencia, conexion);
            SqlDataReader resultado = comando.ExecuteReader();
            Postulante postulante = null;
            while (resultado.Read()) //Si el resultado tiene filas
            {
                postulante = new Postulante();
                postulante.CodigoPostulante = (Int32)resultado["codigopostulante"];
                postulante.ApellidoPaterno  = (String)resultado["apellidopaterno"];
                postulante.ApellidoMaterno  = (String)resultado["apellidomaterno"];
                postulante.Nombre           = (String)resultado["nombre"];
                postulante.Sexo             = (String)resultado["sexo"];
                postulante.Correo           = (String)resultado["correo"];
                postulante.FechaNacimiento  = (DateTime)resultado["fechanacimiento"];                
                postulante.Contrasena       = (String)resultado["Contrasena"];
                listaPostulante.Add(postulante);

            }
            resultado.Close();
            conexion.Close();
            return listaPostulante;
        }
    }
}